package com.bird.thread.base.thread;

/**
 * @author: bird
 * @Data: 2021/6/30 14:31
 * @description: 演示：wait 和notify的用法
 * 1:代码的执行顺序
 * 2：证明wait释放锁
 */
public class Wait {

    // 定义一个对象锁
    public static Object object = new Object();

    // 线程1
    static class Thread1 extends Thread {
        @Override
        public void run() {
            // 对象锁
            synchronized (object) {
                System.out.println(Thread.currentThread().getName() + "开始执行了");
                try {
                    object.wait();// 释放锁 并且让这个线程进入阻塞阶段
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程" + Thread.currentThread().getName() + "获取到了锁。");
            }
        }
    }


    //线程2
    static class Thread2 extends Thread {

        @Override
        public void run() {

            synchronized (object) {
                object.notify();// 唤醒了这个线程 然后需要重新争取获取的锁。
                System.out.println("线程" + Thread.currentThread().getName() + "调用了notify()");
            }

        }
    }

    public static void main(String[] args) throws InterruptedException {

        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();

        thread1.start();

        Thread.sleep(200);

        thread2.start();

    }


    /*总结：
     1：如果一个线程调用了 对象锁的wait()方法,那么说明这个线程即将进入阻塞状态 并且释放锁资源。
        等待被其它的线程唤醒。
    *
    */
}
